Reliability is of key importance to success of any software in the market. Users are easily deterred by a faulty software program. Thus, software developers expend a significant amount of resources to ensure their software is reliable. However, continued pressure on software developers to shorten software development cycles has placed on them an increased demand for making the process of software testing and verification more accurate and less time consuming. Furthermore, costs related to testing and verification has grown to represent a significant portion (50% by some estimates) of the overall cost of developing a piece of software. Thus, automation tools for testing and verification have grown to be more and more sophisticated over time.
One aspect of testing and verification of software (regardless of the type of automation) that is particularly challenging is the ability of a testing tool used to create input data to be used in testing. For instance, if a program accepts integer data as input, one method of testing might be to exhaustively test the software by applying virtually an infinite number of different integers. However, that is not only costly and time consuming but it also may be meaningless or impossible, since the complete set of integers is infinite. Thus, a tester may generate a more meaningful set of integers that would represent a thorough test without testing all integers. For instance, if Age is a field of the type integer then a meaningful domain for such a data member may be limited to integers ranging from 1-100. Such finitization is applicable to virtually any type of data. Thus, the process of testing can be vastly improved by managing the inputs used to manage testing of software programs.
However, manually identifying the various elements of a program and the data types they use and manually configuring inputs for testing can be time consuming, if not impossible. Thus, there is a need to automate the process of identifying the various data structure elements of a program to generate a meaningful set of data for testing and verification.
Furthermore, programs generally don't use data devoid of any context or relationship to other data. For example, most programming languages allow for defining data types and these data type definitions may be further used in defining particular data members such as data fields, and parameters of a program. For example, a person data type may include fields of name, height, weight, and date of birth. Thus, weight may appear not only as a data member of a class, but also as inputs to a method defined in a person class. In a program of any meaningful size there may be literally thousands, if not more, of such relationships and these relationships may also be more complex than the simple example provided above. Thus, there is a need for methods and systems that automate the process of creating inputs used for testing and verification of program and method behaviors.